home *** CD-ROM | disk | FTP | other *** search
Java Source | 2000-09-08 | 3.1 KB | 140 lines |
-
-
-
- package applets;
-
- import shout3d.*;
- import shout3d.core.*;
- import shout3d.math.*;
-
-
- public class RotateMoveZoomPlusPanel extends Shout3DPanel implements DeviceObserver{
-
- Viewpoint camera;
- float fov;
-
- int pixelStartX;
- int pixelStartY;
- int pixelEndX;
- int pixelEndY;
-
- float[] worldPos = new float[3];
-
- float [] eulers = new float [3];
- float [] axisAngle = new float [4];
- Quaternion q = new Quaternion();
-
- float rotationFactor = 30.0f; // pixels per radian
- float translationFactor = .5f; //pixels per meter
- float zoomFactor = 150.0f; //pixels per meter
-
-
- public RotateMoveZoomPlusPanel (Shout3DApplet applet){
- super(applet);
- }
-
- public void customInitialize() {
-
- addDeviceObserver(this,"MouseInput", null);
-
- camera = (Viewpoint) getCurrentBindableNode("Viewpoint");
-
- worldPos = camera.position.getValue();
-
- axisAngle = camera.orientation.getValue();
- q.setAxisAngle(axisAngle);
- q.getEulers(eulers);
-
- fov = camera.fieldOfView.getValue();
-
- String rotationFactorString = applet.getParameter("rotationFactor");
- if (rotationFactorString != null){
- rotationFactor = Float.valueOf(rotationFactorString).floatValue();
- }
-
- String translationFactorString = applet.getParameter("translationFactor");
- if (translationFactorString != null){
- translationFactor = Float.valueOf(translationFactorString).floatValue();
- }
-
- String zoomFactorString = applet.getParameter("zoomFactor");
- if (zoomFactorString != null){
- zoomFactor = Float.valueOf(zoomFactorString).floatValue();
- }
- }
-
-
-
- protected void finalize() {
-
- removeDeviceObserver(this,"MouseInput");
-
- }
-
-
- public boolean onDeviceInput(DeviceInput di, Object userData) {
-
- MouseInput mi = (MouseInput) di;
-
- switch (mi.which){
- case MouseInput.DOWN:
- pixelStartX = mi.x;
- pixelStartY = mi.y;
- return true;
-
-
- case MouseInput.DRAG:
-
- //if left button used
- if (mi.button == 0) {
-
- pixelEndX = mi.x;
- pixelEndY = mi.y;
- int dragDistanceX = pixelEndX - pixelStartX;
- int dragDistanceY = pixelEndY - pixelStartY;
- pixelStartX = pixelEndX;
- pixelStartY = pixelEndY;
-
-
- //ROTATION
-
- float rotationDelta = -(dragDistanceX/rotationFactor);
- eulers[0] = eulers[0] + rotationDelta;
- q.setEulers(eulers);
- q.getAxisAngle(axisAngle);
- camera.orientation.setValue(axisAngle);
-
- //TRANSLATION
-
- float translationDelta = dragDistanceY/translationFactor;
- float[] vector = {0,0, translationDelta};
- q.xform(vector);
- worldPos[0] = worldPos[0] + vector[0];
- worldPos[2] = worldPos[2] + vector[2];
- camera.position.setValue(worldPos);
-
- return true;
-
- }//end of 0 if
-
-
- //if right button used
- if (mi.button == 1) {
-
- pixelEndY = mi.y;
- int dragDistanceY = pixelEndY - pixelStartY;
- float fovDelta = dragDistanceY/zoomFactor;
- fov = fov + fovDelta;
- camera.fieldOfView.setValue(fov);
-
- pixelStartY = pixelEndY;
- return true;
-
- }//end of 1 if
-
- }//end of switch
-
- return false;
- }
-
- } //end of class